package pe.com.bbva.ge.vista.vaadin.ui.registrosolicitud;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.ListUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.ge.domain.configuracion.Valor;
import pe.com.bbva.ge.domain.solicitud.Destino;
import pe.com.bbva.ge.domain.solicitud.DetalleCasetera;
import pe.com.bbva.ge.domain.solicitud.DetalleMoneda;
import pe.com.bbva.ge.domain.solicitud.Solicitud;
import pe.com.bbva.ge.domain.solicitud.TipoSolicitud;
import pe.com.bbva.ge.negocio.SolicitudNegocio;
import pe.com.bbva.ge.vista.vaadin.ui.VentanaUI;
import pe.com.bbva.ge.vista.vaadin.ui.component.ButtonAccion;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;

public class RegistrarSolicitudMensajeUI extends VentanaUI implements ClickListener {

	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private HorizontalLayout hlytBotonera;

	@AutoGenerated
	private ButtonAccion btnCerrar;

	@AutoGenerated
	private ButtonAccion btnCancelar;

	@AutoGenerated
	private ButtonAccion btnAceptar;

	@AutoGenerated
	private VerticalLayout vlytResumen;

	@AutoGenerated
	private Table tblResumen;

	@AutoGenerated
	private VerticalLayout vlytMensaje;

	@AutoGenerated
	private Label lblMensaje;

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	/**
	 * 
	 */
	private static final long serialVersionUID = 5629215361353632091L;
	
	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	
	private Solicitud solicitud;
	
	private Container container;
	
	private Traslado traslado;
	
	@Autowired
	private SolicitudNegocio solicitudNegocio;
	
	public RegistrarSolicitudMensajeUI() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		
		addListeners();
		
	}
	
	private void addListeners() {
		btnAceptar.addListener(this);
		btnCancelar.addListener(this);
		btnCerrar.addListener(this);
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnAceptar))
		{
			grabar();
		} else if(event.getButton().equals(btnCancelar))
		{
			cerrar();
		} else if(event.getButton().equals(btnCerrar))
		{
			cerrar();
		}
	}

	private void grabar() {
		solicitudNegocio.crearSolicitud(solicitud);
		lblMensaje.setValue("Solicitud generada N°" + solicitud.getNumero());
		btnAceptar.setVisible(false);
		btnCancelar.setVisible(false);
		btnCerrar.setVisible(true);
	}

	@Override
	public void postConstruccion() {
		lblMensaje.setValue("¿Está seguro de crear la solicitud?");
		
		btnCerrar.setVisible(false);
		
		if(TipoSolicitud.CODIGO.SERVICIO_POR_RUTA
				.equals(solicitud.getTipo().getCodigo())){
			traslado = Traslado.DINERO_RUTA;
		} else if(TipoSolicitud.CODIGO.PEDIDO_DE_MATERIALES
				.equals(solicitud.getTipo().getCodigo())){
			traslado = Traslado.MATERIAL;
		} else if(TipoSolicitud.CODIGO.OTRO_SERVICIO
				.equals(solicitud.getTipo().getCodigo())){
			traslado = Traslado.OTRO;
		} else {
			traslado = Traslado.DINERO;
		}
		
		construirContainer();
		
	}

	private void construirContainer() {
		
		container = new IndexedContainer();		
		tblResumen.setWidth("400px");
		tblResumen.setHeight("200px");
		tblResumen.setFooterVisible(true);
		
		switch (traslado) {
		case DINERO:
			containerDinero();
			break;

		case DINERO_RUTA:
			containerDineroRuta();
			break;
		
		case MATERIAL:
			containerMaterial();
			break;
					
		case OTRO:
			containerOtro();
			break;
		}
		
		tblResumen.setContainerDataSource(container);
	}

	private void containerDinero() {
		Destino destino = solicitud.getDestinos().get(0);
		
		Map<Valor, BigDecimal> mapTotal = new HashMap<Valor, BigDecimal>();
		Map<Valor, BigDecimal> mapTotalCasetera = new HashMap<Valor, BigDecimal>();
		Map<Valor, BigDecimal> mapTotalDetalle = new HashMap<Valor, BigDecimal>();
		
		//List<String> titulos = new ArrayList<String>();
		//List<String> alineaciones = new ArrayList<String>();
		
		for (DetalleMoneda detalleMoneda : destino.getDetalleMonedas()) {
			mapTotal.put(detalleMoneda.getMoneda(), detalleMoneda.getTotal());
			acumularMap(detalleMoneda.getMoneda(), detalleMoneda.getTotal(), mapTotalDetalle);
		}
		
		for (DetalleCasetera detalleCasetera : destino.getDetalleCaseteras()) {
			Valor moneda = detalleCasetera.getCasetera().getTipo().getDenominacion().getMoneda();
			BigDecimal total = detalleCasetera.getCasetera().getTipo().getDenominacion().getValor().multiply(new BigDecimal(detalleCasetera.getCantidad()));
			acumularMap(moneda, total, mapTotal);
			acumularMap(moneda, total, mapTotalCasetera);
		}
		
		container.addContainerProperty("concepto", String.class, StringUtils.EMPTY);
		Iterator<Valor> divisas = mapTotal.keySet().iterator();
		List<Valor> listDivisas = new ArrayList<Valor>();
		//titulos.add("Concepto");
		//alineaciones.add(Table.ALIGN_LEFT);
		while (divisas.hasNext()) {
			Valor divisa = divisas.next();
			container.addContainerProperty(divisa.getCodigo(), BigDecimal.class, new BigDecimal("0.0"));
			listDivisas.add(divisa);
			//titulos.add(divisa.getCodigo());
			//alineaciones.add(Table.ALIGN_RIGHT);
		}
		
		//int numFilas = 0;
		
		if(!mapTotalDetalle.isEmpty())
		{
			Item itemDetalle = container.addItem("detalle");
			itemDetalle.getItemProperty("concepto").setValue("Monto (Oficina)");
			for (Valor divisa : listDivisas) {
				itemDetalle.getItemProperty(divisa.getCodigo()).setValue(mapTotalDetalle.get(divisa).toString());
			}
			//numFilas++;
		}
		
		if(!mapTotalCasetera.isEmpty())
		{
			Item itemDetalle = container.addItem("atm");
			itemDetalle.getItemProperty("concepto").setValue("Monto ATM");
			for (Valor divisa : listDivisas) {
				itemDetalle.getItemProperty(divisa.getCodigo()).setValue(mapTotalCasetera.get(divisa).toString());
			}
			//numFilas++;
		}
		
		//tblResumen.setColumnHeaders(titulos.toArray(new String[titulos.size()]));
		//tblResumen.setColumnAlignments(alineaciones.toArray(new String[alineaciones.size()]));
		
		//tblResumen.setPageLength(numFilas);
		
		tblResumen.setColumnFooter("concepto", "Total");
		for (Valor divisa : listDivisas) {
			tblResumen.setColumnFooter(divisa.getCodigo(), mapTotal.get(divisa).toString());
		}
		
	}

	private void acumularMap(Valor moneda, BigDecimal total,
			Map<Valor, BigDecimal> map) {
		if(!map.containsKey(moneda))
		{
			map.put(moneda, total);
		}
		else
		{
			map.put(moneda, map.get(moneda).add( total ));
		}
	}

	private void containerDineroRuta() {
		// TODO Auto-generated method stub
		
	}

	private void containerMaterial() {
		// TODO Auto-generated method stub
		
	}

	private void containerOtro() {
		// TODO Auto-generated method stub
		
	}

	public void setSolicitud(Solicitud solicitud) {
		this.solicitud = solicitud;
	}
	
	private enum Traslado
	{
		DINERO, DINERO_RUTA, MATERIAL, OTRO
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// vlytMensaje
		vlytMensaje = buildVlytMensaje();
		mainLayout.addComponent(vlytMensaje);
		
		// vlytResumen
		vlytResumen = buildVlytResumen();
		mainLayout.addComponent(vlytResumen);
		
		// hlytBotonera
		hlytBotonera = buildHlytBotonera();
		mainLayout.addComponent(hlytBotonera);
		mainLayout.setComponentAlignment(hlytBotonera, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildVlytMensaje() {
		// common part: create layout
		vlytMensaje = new VerticalLayout();
		vlytMensaje.setImmediate(false);
		vlytMensaje.setWidth("100.0%");
		vlytMensaje.setHeight("-1px");
		vlytMensaje.setMargin(false);
		
		// lblMensaje
		lblMensaje = new Label();
		lblMensaje.setImmediate(false);
		lblMensaje.setWidth("-1px");
		lblMensaje.setHeight("-1px");
		lblMensaje.setValue("Label");
		lblMensaje.setContentMode(3);
		vlytMensaje.addComponent(lblMensaje);
		
		return vlytMensaje;
	}

	@AutoGenerated
	private VerticalLayout buildVlytResumen() {
		// common part: create layout
		vlytResumen = new VerticalLayout();
		vlytResumen.setImmediate(false);
		vlytResumen.setWidth("100.0%");
		vlytResumen.setHeight("-1px");
		vlytResumen.setMargin(false);
		
		// tblResumen
		tblResumen = new Table();
		tblResumen.setImmediate(false);
		tblResumen.setWidth("-1px");
		tblResumen.setHeight("-1px");
		vlytResumen.addComponent(tblResumen);
		
		return vlytResumen;
	}

	@AutoGenerated
	private HorizontalLayout buildHlytBotonera() {
		// common part: create layout
		hlytBotonera = new HorizontalLayout();
		hlytBotonera.setImmediate(false);
		hlytBotonera.setWidth("-1px");
		hlytBotonera.setHeight("-1px");
		hlytBotonera.setMargin(false);
		hlytBotonera.setSpacing(true);
		
		// btnAceptar
		btnAceptar = new ButtonAccion();
		btnAceptar.setCaption("Si");
		btnAceptar.setImmediate(false);
		btnAceptar.setWidth("-1px");
		btnAceptar.setHeight("-1px");
		hlytBotonera.addComponent(btnAceptar);
		
		// btnCancelar
		btnCancelar = new ButtonAccion();
		btnCancelar.setCaption("No");
		btnCancelar.setImmediate(false);
		btnCancelar.setWidth("-1px");
		btnCancelar.setHeight("-1px");
		hlytBotonera.addComponent(btnCancelar);
		
		// btnCerrar
		btnCerrar = new ButtonAccion();
		btnCerrar.setCaption("Cerrar");
		btnCerrar.setImmediate(false);
		btnCerrar.setWidth("-1px");
		btnCerrar.setHeight("-1px");
		hlytBotonera.addComponent(btnCerrar);
		
		return hlytBotonera;
	}

}
